package com.jay.serializer;

import com.caucho.hessian.io.HessianInput;
import com.caucho.hessian.io.HessianOutput;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * Hessian 序列化器
 * 实现了Serializer接口，提供对象到字节数组的序列化和字节数组到对象的反序列化功能
 * Hessian是一种高效的二进制Web服务协议，它通过紧凑的二进制格式来优化数据的传输和处理
 */
public class HessianSerializer implements Serializer {

    /**
     * 序列化方法
     * 将给定的对象转换为字节数组
     * 此方法使用Hessian的二进制格式进行序列化，以实现高效的数据存储和传输
     *
     * @param object 待序列化的对象，可以是任何类型的对象
     * @return 返回序列化后的字节数组
     * @throws IOException 如果序列化过程中发生I/O错误
     */
    @Override
    public <T> byte[] serialize(T object) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        HessianOutput ho = new HessianOutput(bos);
        ho.writeObject(object);
        return bos.toByteArray();
    }

    /**
     * 反序列化方法
     * 将给定的字节数组转换为指定类的对象
     * 此方法使用Hessian的二进制格式进行反序列化，以实现高效的数据恢复
     *
     * @param bytes    待反序列化的字节数组
     * @param tClass   目标对象的类，用于指定反序列化对象的类型
     * @param <T>      泛型参数，表示目标对象的类型
     * @return 返回反序列化后的对象，类型为T
     * @throws IOException 如果反序列化过程中发生I/O错误
     */
    @Override
    public <T> T deserialize(byte[] bytes, Class<T> tClass) throws IOException {
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        HessianInput hi = new HessianInput(bis);
        return (T) hi.readObject(tClass);
    }
}
